//
//  CZStatus.swift
//  czbkiosweibo5
//
//  Created by zhangping on 15/10/16.
//  Copyright © 2015年 zhangping. All rights reserved.
//


import UIKit
import SDWebImage


/// 微博模型
class CZStatus: NSObject {
    // MARK: - 属性
    
    /// 微博创建时间
    var created_at: String?
    
    /// 微博ID
    var id: Int = 0
    
    /// 微博信息内容
    var text: String?
    
    /// 微博来源
    var source: String?
    
    // 通过分析微博返回的数据 是一个数组,数组里面是一个字典["thumbnail_pic": url]
    /// 图片地址数组
    var pic_urls: [[String: AnyObject]]? {
        didSet {
            // 判断pic_urls 是否有值,没有值直接返回
            let count = pic_urls?.count ?? 0
            if count == 0 {
                return
            }
            
            // 有值,遍历将pic_urls 里的string转成NSURL存放在pictureURLs数组里面
            storePictureURLs = [NSURL]()
            largeStorePictureURLs = [NSURL]()
            
            for dict in pic_urls! {
                // 取出 字典中的值
                let value = dict["thumbnail_pic"] as! String
                storePictureURLs?.append(NSURL(string: value)!)
                
                // 转成大图url
                let largeUrlString = value.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                largeStorePictureURLs?.append(NSURL(string: largeUrlString)!)
            }
        }
    }
    
    /// 存储型属性,存储的是微博的pic_urls里面对应的URL
    var storePictureURLs: [NSURL]?
    
    /// 存储型属性,存储的是微博的pic_urls里面对应的大图URL
    var largeStorePictureURLs: [NSURL]?
    
    /*
        让pictureURLs既显示原创微博的pic_urls里面对应的URL,又显示被转发微博的pic_urls里面对应的URL
        1.原创微博的图片是保存在pic_urls属性里面
        2.被转发微博的图片是保存在retweeted_status.pic_urls属性里面
    */
    var pictureURLs: [NSURL]? {
        // 原创微博返回:storePictureURLs
        // 转发微博返回:retweeted_status.storePictureURLs
        return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
    }
    
    /// 大图URL
    var largePictureURLs: [NSURL]? {
        // 原创微博返回:largeStorePictureURLs
        // 转发微博返回:retweeted_status.largeStorePictureURLs
        return retweeted_status == nil ? largeStorePictureURLs : retweeted_status?.largeStorePictureURLs
    }
    
    /// 用户模型
    var user: CZUser?
    
    /// 行高属性
    var rowHeight: CGFloat?
    
    /// 被转发微博
    var retweeted_status: CZStatus?
    
    /// 字典转模型
    init(dict: [String: AnyObject]) {
        super.init()
        
        // KVC赋值
        setValuesForKeysWithDictionary(dict)
    }
    
    /// 处理字典的key在模型中没有对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    /// KVC赋值时对 user 属性特殊处理
    override func setValue(value: AnyObject?, forKey key: String) {
        
        // 如果是 user 属性
        if key == "user" {
//            print("user: \(value)")
            if let dict = value as? [String: AnyObject] {
                // 字典转模型
                user = CZUser(dict: dict)
            }
            
            // 一定要记得 return
            return
        }
        
        // 判断如果key == retweeted_status,我们自己将字典转成模型,在赋值给retweeted_status属性
        if key == "retweeted_status" {
            if let dict = value as? [String: AnyObject] {
                retweeted_status = CZStatus(dict: dict)
            }
            
            // 一定要记得返回,否则又会被覆盖回去
            return
        }
        
        super.setValue(value, forKey: key)
    }
    
    /// 打印对象
    override var description: String {
        let properties = ["id", "created_at", "source", "text", "pic_urls", "user"]
        return "微博对象: \(dictionaryWithValuesForKeys(properties))"
    }
    
    /**
    从网络加载数据,字典转模型
    - parameter since_id: 加载大于since_id大的微博, 默认为0
    - parameter max_id:   加载小于或等于max_id的微博, 默认为0
    - parameter finished: 加载数据完成时的回调
    - parameter error:    错误
    */
    class func loadStatus(since_id: Int, max_id: Int, finished: (list: [CZStatus]?, error: NSError?) -> ()) {
        // 尾随闭包,当尾随闭包前面的参数为空的时候方法后面的()可以省略
        CZNetworkTool.sharedInstance.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
            // 判断是否有错误
            if error != nil {
                print("加载微博数据出错了: \(error)")
                finished(list: nil, error: error!)
                return
            }
            
            // 没有出错,获取返回数据里面的微博数据
            if let array = result?["statuses"] as? [[String: AnyObject]] {
                // 创建模型数组
                var list = [CZStatus]()
                
                // 字典转模型
                for dict in array {
                    list.append(CZStatus(dict: dict))
                }
                
                // 先将图片缓存下来,在调用finished返回数据
                cacheWebImage(list, finished: finished)
                
                // 返回数据
//                finished(list: list, error: nil)
            } else {
                // 没有加载到数据
                finished(list: nil, error: nil)
            }
        }
    }
    
    /**
    缓存微博图片
    - parameter lists:    微博数组
    - parameter finished: 缓存完成的闭包
    */
    class func cacheWebImage(lists: [CZStatus], finished: (list: [CZStatus]?, error: NSError?) -> ()) {
        // 定义任务组
        let group = dispatch_group_create()
        
        // 记录下载图片的大小
        var length = 0
        
        // 遍历模型数组
        for status in lists {
            // 获取到微博模型里面的配图url
            guard let urls = status.pictureURLs else {
                // 如果没有图片,遍历下一个模型
                continue
            }
            
            // 遍历图片数组.获取到没一个需要下载的url
            // 不缓存所有微博的图片,只缓存单张图片
//            for url in urls {
            if urls.count == 1 {
                let url = urls[0]
//                print("图片地址: \(url)")
                
                // 进入任务组
                dispatch_group_enter(group)
                
                // 使用SDWebImage下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    // 离开任务组
                    dispatch_group_leave(group)
                    
                    // 判断下载是否有错误
                    if error != nil {
                        print("下载图片出错")
                        return
                    }
                    
                    // 下载图片没有出错
                    print("下载完成: \(url)")
                    
                    // 获取下载图片的大小
                    if let data = UIImagePNGRepresentation(image) {
                        length += data.length
                    }
                })
            }
        }
        
        // 下载完成所有图片才通知调用者微博数据加载完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("下载所有图片完成: \(length / 1024) K")
            // 返回数据
            finished(list: lists, error: nil)
        }
    }
}
